home *** CD-ROM | disk | FTP | other *** search
/ Programming Languages Suite / ProgramD2.iso / Borland / Borland C++ V5.02 / RICHEDIT.PAK / RICHEDAP.CPP < prev    next >
C/C++ Source or Header  |  1997-05-06  |  11KB  |  490 lines

  1. //----------------------------------------------------------------------------
  2. // ObjectWindows
  3. // (c) Copyright 1995, 1996 by Borland International, All Rights Reserved
  4. //
  5. // Illustrates usage of TRichEdit class
  6. //----------------------------------------------------------------------------
  7. #include <owl/pch.h>
  8. #include <owl/decframe.h>
  9. #include <owl/statusba.h>
  10. #include <owl/controlb.h>
  11. #include <owl/buttonga.h>
  12. #include <owl/applicat.h>
  13. #include <owl/richedit.h>
  14. #include <owl/richedpr.h>
  15. #include <owl/choosefo.h>
  16. #include "richedap.h"
  17.  
  18. //
  19. //
  20. //
  21. const int  IDRichEd = 0x100;
  22. const int  UnChk    = TCommandEnabler::Unchecked;
  23. const int  Chk      = TCommandEnabler::Checked;
  24.  
  25. //
  26. // Class TRichEdApp
  27. // ~~~~~ ~~~~~~~~~~
  28. //
  29. class TRichEdApp : public TApplication {
  30.   public:
  31.     void    InitMainWindow();
  32. };
  33.  
  34. //
  35. // Class TRichEdFrame
  36. // ~~~~~ ~~~~~~~~~~~~
  37. //
  38. class TRichEdFrame : public TDecoratedFrame {
  39.   public:
  40.     TRichEdFrame(TWindow*     parent,
  41.                  const char * title = 0,
  42.                  TWindow*     clientWnd = 0);
  43.     ~TRichEdFrame();
  44.  
  45.     void  SetupWindow();
  46.  
  47.     // File Command Handlers
  48.     //
  49.     void  CmFileNew();
  50.     void  CmFileOpen();
  51.     void  CmFilePrint();
  52.     void  CmFilePrintPreview();
  53.  
  54.     // Format Command Handlers
  55.     //
  56.     void  CmFormatFont();
  57.     void  CmFormatPara();
  58.     void  CmFormatTabs();
  59.     void  CmFormatBold();
  60.     void  CmFormatItalic();
  61.     void  CmFormatUnderline();
  62.     void  CmFormatStrikeout();
  63.     void  CmFormatTextData();
  64.     void  CmFormatRTFData();
  65.     void  CeFormatFont(TCommandEnabler&);
  66.     void  CeFormatPara(TCommandEnabler&);
  67.     void  CeFormatTabs(TCommandEnabler&);
  68.     void  CeFormatBold(TCommandEnabler&);
  69.     void  CeFormatItalic(TCommandEnabler&);
  70.     void  CeFormatUnderline(TCommandEnabler&);
  71.     void  CeFormatStrikeout(TCommandEnabler&);
  72.     void  CeFormatTextData(TCommandEnabler&);
  73.     void  CeFormatRTFData(TCommandEnabler&);
  74.  
  75.     bool  EnDropFiles(TEnDropFiles&){return false;}
  76.     bool  EnMsgFilter(TMsgFilter&){return false;}
  77.     bool  EnProtected(TEnProtected&){return false;}
  78.     void  EnReqResize(TReqResize&){}
  79.  
  80.   protected:
  81.     TRichEdit*      Edit;       // Rich Edit Control
  82.  
  83.     // It's typical to create the 'TPrinter' object at the application level.
  84.     // This allows the same device to be shared between PrintPreview and
  85.     // actual Printing. It also ensures that configurations applied to the
  86.     // printer are visible to all 'printer-related' aspects of the
  87.     // application.
  88.     //
  89.     TPrinter*       Printer;
  90.  
  91.   DECLARE_RESPONSE_TABLE(TRichEdFrame);
  92. };
  93.  
  94.  
  95. DEFINE_RESPONSE_TABLE1(TRichEdFrame, TDecoratedFrame)
  96.   EV_COMMAND(CM_FILENEW, CmFileNew),
  97.   EV_COMMAND(CM_FILEOPEN, CmFileOpen),
  98.   EV_COMMAND(CM_FILEPRINT, CmFilePrint),
  99.   EV_COMMAND(CM_FILEPRINTPREVIEW, CmFilePrintPreview),
  100.  
  101.   EV_COMMAND(CM_FORMATFONT,      CmFormatFont),
  102.   EV_COMMAND(CM_FORMATPARAGRAPH, CmFormatPara),
  103.   EV_COMMAND(CM_FORMATTABS,      CmFormatTabs),
  104.  
  105.   EV_COMMAND(CM_FORMATBOLD,      CmFormatBold),
  106.   EV_COMMAND(CM_FORMATITALIC,    CmFormatItalic),
  107.   EV_COMMAND(CM_FORMATUNDERLINE, CmFormatUnderline),
  108.   EV_COMMAND(CM_FORMATSTRIKEOUT, CmFormatStrikeout),
  109.   EV_COMMAND(CM_FORMATTEXTDATA,  CmFormatTextData),
  110.   EV_COMMAND(CM_FORMATRTFDATA,   CmFormatRTFData),
  111.  
  112.   EV_COMMAND_ENABLE(CM_FORMATFONT,      CeFormatFont),
  113.   EV_COMMAND_ENABLE(CM_FORMATPARAGRAPH, CeFormatPara),
  114.   EV_COMMAND_ENABLE(CM_FORMATTABS,      CeFormatTabs),
  115.   EV_COMMAND_ENABLE(CM_FORMATBOLD,      CeFormatBold),
  116.   EV_COMMAND_ENABLE(CM_FORMATITALIC,    CeFormatItalic),
  117.   EV_COMMAND_ENABLE(CM_FORMATUNDERLINE, CeFormatUnderline),
  118.   EV_COMMAND_ENABLE(CM_FORMATSTRIKEOUT, CeFormatStrikeout),
  119.   EV_COMMAND_ENABLE(CM_FORMATTEXTDATA,  CeFormatTextData),
  120.   EV_COMMAND_ENABLE(CM_FORMATRTFDATA,   CeFormatRTFData),
  121.  
  122.   EV_EN_DROPFILES(IDRichEd, EnDropFiles),
  123.   EV_EN_MSGFILTER(IDRichEd, EnMsgFilter),
  124.   EV_EN_PROTECTED(IDRichEd, EnProtected),
  125.   EV_EN_REQRESIZE(IDRichEd, EnReqResize),
  126. END_RESPONSE_TABLE;
  127.  
  128. //
  129. //
  130. //
  131. TRichEdFrame::TRichEdFrame(TWindow* parent, const char* title,
  132.                            TWindow* client):
  133. TDecoratedFrame(parent, title, client), Printer(0)
  134. {
  135.   Edit = TYPESAFE_DOWNCAST(client, TRichEdit);
  136.   CHECK(Edit);
  137. }
  138.  
  139. //
  140. //
  141. //
  142. TRichEdFrame::~TRichEdFrame()
  143. {
  144.   delete Printer;
  145. }
  146.  
  147. //
  148. //
  149. //
  150. void
  151. TRichEdFrame::SetupWindow()
  152. {
  153.   TDecoratedFrame::SetupWindow();
  154.  
  155.   // Change font to ANSI Variable - 
  156.   //
  157.   HFONT hFont = HFONT(::GetStockObject(ANSI_VAR_FONT));
  158.   if (hFont)
  159.     Edit->SetWindowFont(hFont, true);
  160. }
  161.  
  162. //
  163. //
  164. //
  165. void
  166. TRichEdFrame::CmFileNew()
  167. {
  168.   if (Edit)
  169.     Edit->NewFile();
  170. }
  171.  
  172. //
  173. //
  174. //
  175. void
  176. TRichEdFrame::CmFileOpen()
  177. {
  178.   if (Edit)
  179.     Edit->Open();
  180. }
  181.  
  182. //
  183. //
  184. //
  185. void
  186. TRichEdFrame::CmFilePrint ()
  187. {
  188.   // Create Printer object
  189.   //
  190.   if (!Printer)
  191.     Printer = new TPrinter(GetApplication());
  192.  
  193.   // Create Printout window and set characteristics.
  194.   //
  195.   const char* title = Edit->GetFileName() ? Edit->GetFileName() : "Untitled";
  196.   TRichEditPrintout printout(*Printer, *Edit, title);
  197.   printout.SetBanding(true);
  198.  
  199.   // Bring up the Print dialog and print the document.
  200.   //
  201.   Printer->Print(this, printout, true);
  202. }
  203.  
  204. //
  205. //
  206. //
  207. void
  208. TRichEdFrame::CmFilePrintPreview()
  209. {
  210.   if (Edit) {
  211.  
  212.     // Create 'TPrinter' object to represent physical printer device
  213.     //
  214.     if (!Printer)
  215.       Printer = new TPrinter(GetApplication());
  216.  
  217.     // Create 'TRichEditPrintout' object to represent RTF documents
  218.     //
  219.     TRichEditPrintout printout(*Printer,
  220.                                *Edit,
  221.                                "Print Preview");
  222.  
  223.     // Create a preview window
  224.     //
  225.     TRichEditPreviewFrame *prevW;
  226.     prevW = new TRichEditPreviewFrame(this, *Printer, printout,
  227.                                      *Edit, printout.GetTitle(),
  228.                                       new TLayoutWindow(0));
  229.     prevW->Execute();
  230.   }
  231. }
  232.  
  233. //
  234. //
  235. //
  236. void
  237. TRichEdFrame::CmFormatFont()
  238. {
  239.   //
  240.   // Retrieve current character format
  241.   //
  242.   TCharFormat chFormat(*Edit);
  243.  
  244.   //
  245.   // Fill logfont structure using info. from character format
  246.   //
  247.   LOGFONT lf;
  248.   chFormat.SetFontInfo(lf);
  249.  
  250.   //
  251.   // Initialize structure for Font common dialog
  252.   //
  253.   TChooseFontDialog::TData fontData;
  254.   fontData.LogFont = lf;
  255.   fontData.DC = TClientDC(*this);
  256.   fontData.Flags = CF_SCREENFONTS | CF_INITTOLOGFONTSTRUCT | CF_EFFECTS;
  257.   fontData.Color = chFormat.GetTextColor();
  258.   fontData.FontType = SCREEN_FONTTYPE;
  259.  
  260.   //
  261.   // Display dialog
  262.   //
  263.   if (TChooseFontDialog(this, fontData).Execute() == IDOK) {
  264.     //
  265.     // Update character format from chosen font info
  266.     //
  267.     chFormat.GetFontInfo(fontData.LogFont);
  268.     chFormat.SetTextColor(fontData.Color);
  269.     Edit->SetCharFormat(chFormat);
  270.   }
  271. }
  272.  
  273. //
  274. //
  275. //
  276. void
  277. TRichEdFrame::CmFormatPara()
  278. {
  279. }
  280.  
  281. //
  282. //
  283. //
  284. void
  285. TRichEdFrame::CmFormatTabs()
  286. {
  287. }
  288.  
  289. //
  290. //
  291. //
  292. void
  293. TRichEdFrame::CmFormatBold()
  294. {
  295.   Edit->ToggleCharAttribute(CFM_BOLD, CFE_BOLD);
  296. }
  297.  
  298. //
  299. //
  300. //
  301. void
  302. TRichEdFrame::CmFormatItalic()
  303. {
  304.   Edit->ToggleCharAttribute(CFM_ITALIC, CFE_ITALIC);
  305. }
  306.  
  307. //
  308. //
  309. //
  310. void
  311. TRichEdFrame::CmFormatUnderline()
  312. {
  313.   Edit->ToggleCharAttribute(CFM_UNDERLINE, CFE_UNDERLINE);
  314. }
  315.  
  316. //
  317. //
  318. //
  319. void
  320. TRichEdFrame::CmFormatStrikeout()
  321. {
  322.   Edit->ToggleCharAttribute(CFM_STRIKEOUT, CFE_STRIKEOUT);
  323. }
  324.  
  325. //
  326. //
  327. //
  328. void  
  329. TRichEdFrame::CmFormatTextData()
  330. {
  331.   Edit->SetFormat(SF_TEXT);
  332. }
  333.  
  334. //
  335. //
  336. //
  337. void  
  338. TRichEdFrame::CmFormatRTFData()
  339. {
  340.   Edit->SetFormat(SF_RTF);
  341. }
  342.  
  343. //
  344. //
  345. //
  346. void
  347. TRichEdFrame::CeFormatFont(TCommandEnabler& /*ce*/)
  348. {
  349. }
  350.  
  351. //
  352. //
  353. //
  354. void
  355. TRichEdFrame::CeFormatPara(TCommandEnabler& /*ce*/)
  356. {
  357. }
  358.  
  359. //
  360. //
  361. //
  362. void
  363. TRichEdFrame::CeFormatTabs(TCommandEnabler& /*ce*/)
  364. {
  365. }
  366.  
  367. //
  368. //
  369. //
  370. void
  371. TRichEdFrame::CeFormatBold(TCommandEnabler& ce)
  372. {
  373.   uint result = Edit->HasCharAttribute(CFM_BOLD, CFE_BOLD);
  374.   ce.SetCheck(result  ? Chk : UnChk);
  375. }
  376.  
  377. //
  378. //
  379. //
  380. void
  381. TRichEdFrame::CeFormatItalic(TCommandEnabler& ce)
  382. {
  383.   uint result = Edit->HasCharAttribute(CFM_ITALIC, CFE_ITALIC);
  384.   ce.SetCheck(result ? Chk : UnChk);
  385. }
  386.  
  387. //
  388. //
  389. //
  390. void
  391. TRichEdFrame::CeFormatUnderline(TCommandEnabler& ce)
  392. {
  393.   uint result = Edit->HasCharAttribute(CFM_UNDERLINE, CFE_UNDERLINE);
  394.   ce.SetCheck(result ? Chk : UnChk);
  395. }
  396.  
  397. //
  398. //
  399. //
  400. void
  401. TRichEdFrame::CeFormatStrikeout(TCommandEnabler& ce)
  402. {
  403.   uint result = Edit->HasCharAttribute(CFM_STRIKEOUT, CFE_STRIKEOUT);
  404.   ce.SetCheck(result ? Chk : UnChk);
  405. }
  406.  
  407. //
  408. //
  409. //
  410. void  
  411. TRichEdFrame::CeFormatTextData(TCommandEnabler& ce)
  412. {
  413.   ce.SetCheck((Edit->IsRTF() == false) ? Chk : UnChk);
  414. }
  415.  
  416. //
  417. //
  418. //
  419. void  
  420. TRichEdFrame::CeFormatRTFData(TCommandEnabler& ce)
  421. {
  422.   ce.SetCheck((Edit->IsRTF()) ? Chk : UnChk);
  423. }
  424.  
  425. // -------------------------------------------------------------------
  426. // Methods of application object
  427. // -------------------------------------------------------------------
  428. void
  429. TRichEdApp::InitMainWindow()
  430. {
  431.   // Create client RICHEDIT object
  432.   //
  433.   TRichEdit* client = new TRichEdit(0, IDRichEd, "", 0, 0, 0, 0, 0);
  434.  
  435.   // Create main/frame object
  436.   //
  437.   SetMainWindow(new TRichEdFrame(0, 0, client));
  438.  
  439.   // Setup to use menu
  440.   //
  441.   GetMainWindow()->AssignMenu(IDM_APPMENU);
  442.  
  443.   // Create decorations
  444.   //
  445.   TStatusBar*  sbar = new TStatusBar(GetMainWindow(), TGadget::Recessed,
  446.            TStatusBar::CapsLock | TStatusBar::NumLock |
  447.            TStatusBar::Overtype | TStatusBar::SizeGrip);
  448.   TControlBar* cbar = new TControlBar(GetMainWindow());
  449.  
  450.   // Insert gadgets in control bar
  451.   //
  452.   cbar->Insert(*new TButtonGadget(CM_FILENEW, CM_FILENEW));
  453.   cbar->Insert(*new TButtonGadget(CM_FILEOPEN, CM_FILEOPEN));
  454.   cbar->Insert(*new TButtonGadget(CM_FILESAVE, CM_FILESAVE));
  455.   cbar->Insert(*new TButtonGadget(CM_FILEPRINT, CM_FILEPRINT));
  456.  
  457.   cbar->Insert(*new TSeparatorGadget(6));
  458.   cbar->Insert(*new TButtonGadget(CM_EDITUNDO, CM_EDITUNDO));
  459.   cbar->Insert(*new TButtonGadget(CM_EDITCUT, CM_EDITCUT));
  460.   cbar->Insert(*new TButtonGadget(CM_EDITCOPY, CM_EDITCOPY));
  461.   cbar->Insert(*new TButtonGadget(CM_EDITPASTE, CM_EDITPASTE));
  462.  
  463.   cbar->Insert(*new TSeparatorGadget(6));
  464.   cbar->Insert(*new TButtonGadget(CM_FORMATBOLD, CM_FORMATBOLD,
  465.                                   TButtonGadget::NonExclusive));
  466.   cbar->Insert(*new TButtonGadget(CM_FORMATITALIC, CM_FORMATITALIC,
  467.                                   TButtonGadget::NonExclusive));
  468.   cbar->Insert(*new TButtonGadget(CM_FORMATUNDERLINE, CM_FORMATUNDERLINE,
  469.                                   TButtonGadget::NonExclusive));
  470.  
  471.   cbar->Insert(*new TSeparatorGadget(6));
  472.   cbar->Insert(*new TButtonGadget(CM_HELPABOUT, CM_HELPABOUT));
  473.  
  474.   TYPESAFE_DOWNCAST(GetMainWindow(), TDecoratedFrame)->Insert(
  475.                     *cbar, TDecoratedFrame::Top);
  476.   TYPESAFE_DOWNCAST(GetMainWindow(), TDecoratedFrame)->Insert(
  477.                     *sbar, TDecoratedFrame::Bottom);
  478.   GetMainWindow()->Attr.AccelTable = TResId(IDA_RICHEDIT);
  479. }
  480.  
  481. //
  482. //
  483. //
  484. int
  485. OwlMain(int /*argc*/, char * /*argv*/ [])
  486. {
  487.   TRichEdApp().Run();
  488.   return 0;
  489. }
  490.